package com.leadbank.baselbf.leadutils;


import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * @ClassName: BigDecimalUtils
 * @Description:
 * @Author: zhouzhiguo
 * @Date: 2024/3/15 17:39
 * @Version: 5.0.6
 * 上海利得金融科技集团版权所有.
 */

public class BigDecimalUtils {
    /**
     * 两个double相加
     *
     * @param v1 被加数
     * @param v2 加数
     * @return
     */
    public static BigDecimal add(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(LbwADIUtils.nvl(v1, "0"));
        BigDecimal b2 = new BigDecimal(LbwADIUtils.nvl(v2, "0"));
        return b1.add(b2);
    }

    /**
     * 两个double相加
     *
     * @param v1 被加数
     * @param v2 加数
     * @return
     */
    public static BigDecimal add(BigDecimal v1, BigDecimal v2) {
        return v1.add(v2);
    }

    /**
     * 两个double相减
     * v1 -v2
     *
     * @param v1 被减数
     * @param v2 减数
     * @return
     */
    public static BigDecimal sub(BigDecimal v1, BigDecimal v2) {
        return v1.subtract(v2);
    }

    /**
     * 两个double相减
     * v1 -v2
     *
     * @param v1 被减数
     * @param v2 减数
     * @return
     */
    public static BigDecimal sub(Double v1, Double v2) {
        BigDecimal b1 = new BigDecimal(LbwADIUtils.nvl(v1, "0"));
        BigDecimal b2 = new BigDecimal(LbwADIUtils.nvl(v2, "0"));
        return b1.subtract(b2);
    }

    public static BigDecimal sub(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(LbwADIUtils.nvl(v1, "0"));
        BigDecimal b2 = new BigDecimal(LbwADIUtils.nvl(v2, "0"));
        return b1.subtract(b2);
    }

    /**
     * v1/v2
     *
     * @param v1 被除数
     * @param v2 除数
     * @return
     */
    public static BigDecimal div(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(LbwADIUtils.nvl(v1, "0"));
        BigDecimal b2 = new BigDecimal(LbwADIUtils.nvl(v2, "0"));
        return b1.divide(b2, 8, BigDecimal.ROUND_UP);
    }
    /**
     * v1/v2
     *
     * @param v1 被除数
     * @param v2 除数
     * @return
     */
    public static BigDecimal div(BigDecimal v1, BigDecimal v2) {
        return v1.divide(v2, 8, BigDecimal.ROUND_UP);
    }

    /**
     * double*double
     *
     * @param v1 被除数
     * @param v2 乘数
     * @return
     */
    public static BigDecimal div(Double v1, Double v2) {

        BigDecimal b1 = new BigDecimal(LbwADIUtils.nvl(v1, "0"));
        BigDecimal b2 = new BigDecimal(LbwADIUtils.nvl(v2, "0"));
        return b1.divide(b2, 8, BigDecimal.ROUND_UP);
    }

    /**
     * double*double
     *
     * @param v1 被乘数
     * @param v2 乘数
     * @return
     */
    public static BigDecimal mul(String v1, String v2) {

        BigDecimal b1 = new BigDecimal(LbwADIUtils.nvl(v1, "0"));
        BigDecimal b2 = new BigDecimal(LbwADIUtils.nvl(v2, "0"));
        return b1.multiply(b2);
    }

    /**
     * double*double
     *
     * @param v1 被乘数
     * @param v2 乘数
     * @return
     */
    public static BigDecimal mul(Double v1, Double v2) {

        BigDecimal b1 = new BigDecimal(LbwADIUtils.nvl(v1, "0"));
        BigDecimal b2 = new BigDecimal(LbwADIUtils.nvl(v2, "0"));
        return b1.multiply(b2);
    }

    /**
     * double*double
     *
     * @param v1 被乘数
     * @param v2 乘数
     * @return
     */
    public static BigDecimal mul(BigDecimal v1, BigDecimal v2) {
        return v1.multiply(v2);
    }


    /**
     * BigDecimal compareTo
     * int a = bigdemical.compareTo(bigdemical2)
     * a = -1   ,表示bigdemical小于bigdemical2；
     * a = 0   ,表示bigdemical等于bigdemical2；
     * a = 1   ,表示bigdemical大于bigdemical2；
     *
     * @param price1
     * @param price2
     * @return
     */
    public static int getBigDecimalCompareTo(String price1, String price2) {
        BigDecimal b1 = new BigDecimal(LbwADIUtils.nvl(price1, "0.00"));
        BigDecimal b2 = new BigDecimal(LbwADIUtils.nvl(price2, "0.00"));
        return b1.compareTo(b2);
    }

    /**
     * BigDecimal compareTo
     * int a = b1.compareTo(b2)
     * a = -1   ,表示 b1 小于 b2；
     * a = 0   ,表示 b1 等于 b2；
     * a = 1   ,表示 b1 大于 b2；
     *
     * @param b1
     * @param b2
     * @return
     */
    public static int getBigDecimalCompareTo(BigDecimal b1, BigDecimal b2) {
        return b1.compareTo(b2);
    }

    /**
     * 展示费用
     *
     * @param fee
     * @return
     */
    public static BigDecimal showDecimal2(BigDecimal fee) {
        try {
            BigDecimal rounded = fee.setScale(2, RoundingMode.HALF_UP);
            return rounded;
        } catch (Exception e) {
            e.printStackTrace();
            return fee;
        }

//        return String.format("%.2f", fee);
    }
    /**
     * 展示费用
     *
     * @param fee
     * @return
     */
    public static BigDecimal showDecimal2Truncation(BigDecimal fee) {
        try {
//            DecimalFormat decimalFormat = new DecimalFormat("#.00");
//            BigDecimal rounded =  decimalFormat.format(fee);
            BigDecimal rounded = fee.setScale(2, RoundingMode.DOWN);
            return rounded;
        } catch (Exception e) {
            e.printStackTrace();
            return fee;
        }

//        return String.format("%.2f", fee);
    }
    /**
     * 展示费用
     *
     * @param fee
     * @return
     */
    public static String showFee2(BigDecimal fee) {
        try {
            DecimalFormat decimalFormat = new DecimalFormat("#,##0.00");
            decimalFormat.setRoundingMode(RoundingMode.FLOOR);
            return decimalFormat.format(fee);
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }
    /**
     * 展示费用
     *
     * @param fee
     * @return
     */
    public static String showFee2Down(BigDecimal fee) {
        try {
            DecimalFormat decimalFormat = new DecimalFormat("#,##0.00");
            decimalFormat.setRoundingMode(RoundingMode.DOWN);
            return decimalFormat.format(fee);
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }


    public static String showFee2(String fee) {
        try {
            if (LbwADIUtils.isNvl(fee)){
                return "";
            }
            if (fee.contains(",")){
                return fee;
            }

            BigDecimal bg = getForStr(fee);
            DecimalFormat decimalFormat = new DecimalFormat("#,##0.00");
            decimalFormat.setRoundingMode(RoundingMode.DOWN);
            return decimalFormat.format(bg);
        } catch (Exception e) {
            e.printStackTrace();
            return fee;
        }
    }
    public static String showFee2(Double fee) {
        try {
            BigDecimal b1 = new BigDecimal(LbwADIUtils.nvl(fee, "0.00"));
            DecimalFormat decimalFormat = new DecimalFormat("#,##0.00");
            decimalFormat.setRoundingMode(RoundingMode.FLOOR);
            return decimalFormat.format(b1);
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
//        return String.format("%.2f", fee);
    }

    /**
     * 展示费率
     *
     * @param rate
     * @return
     */
    public static String showRate(BigDecimal rate) {
        BigDecimal showRate = rate.setScale(rateLength, BigDecimal.ROUND_DOWN).stripTrailingZeros();
        String rateStr = showRate.toPlainString();
        if (rateStr.contains(".")) {
            String decimalPlaces = rateStr.split("\\.")[1];
            if (decimalPlaces.length() < 2) {
                return String.format("%.2f", showRate);
            } else {
                return rateStr;
            }

        } else {
//            DecimalFormat decimalFormat = new DecimalFormat("#,##0.00");
            return String.format("%.2f", showRate);
        }

    }


    /**
     * 费率展示最多8位
     */
    private static final int rateLength = 6;


    /**
     * 数字将字符串转化为 BigDecimal
     *
     * @param v
     * @return
     */
    public static BigDecimal getForStr(String v) {
        String v1 = v;
        if (LbwMoneyUtils.amountIsZero(v1)) {
            v1 = "0.00";
        }
        BigDecimal b1 = new BigDecimal(v1);
        return b1;
    }

    /**
     * 数字将字符串转化为 Double
     *
     * @param v1
     * @return
     */

    public static BigDecimal getForDouble(Double v1) {
        if (LbwMoneyUtils.amountIsZero(v1)) {
            v1 = 0.00;
        }
        BigDecimal b1 = BigDecimal.valueOf(v1);
        return b1;
    }

    public static Double getDouble(BigDecimal v1) {
        Double d = v1.doubleValue();
        return d;
    }
}
